Каждый черновой тест-кейс (особенно negative/edge) положен на экранное состояние прототипа. Каждое требование R1–R22 имеет точку на экране; каждый элемент UI восходит к требованию. Решения DQ-1…6 — зафиксированы.
Принято дизайнером. DQ-3 требует фиксации в дизайн-системе.
4 вкладки: Дашборд / Мероприятия / Подписки / Меню. Линейный drill раздел→список→карточка живёт внутри вкладок. Снимает перегрузку главной четырьмя типами.
Процент крупно (знак + цвет), абсолют мелким рядом, подпись базы под ними. Видны обе формы — без выбора одной.
Прошлый период = 0, текущий > 0 → показываем «0» крупно + абсолют «+N подп.» мелким (без бейджа «рост с нуля»). «∞» и «+100%» запрещены. Оба периода = 0 → прочерк «без активности · н/д». Финал.
Стопкой везде: ₽ (violet) над € (emerald). Применяется в виджетах дашборда, в карточке «Итог», в строках списка мероприятий, в строках тарифов и в итоговой строке подписок. Колонки запрещены. Если в данных нет евро — выводится только ₽; в строках списка резервируется пустой слот высоты ₽-строки, чтобы соседние строки не «прыгали» (B-6).
Списки — 1 строка + многоточие (CSS ellipsis, адаптивно к ширине, без жёсткого лимита символов). Карточка — полное имя, переносится в 2–3 строки.
Плашка-кнопка со счётчиком «показано N из M». Порция 20 (R21). При исчерпании списка кнопка скрывается.
Все состояния из дизайн-заметок имеют экранное представление. Подсостояния «Загрузка» объединены сознательно (B-8).
| Состояние | Где в прототипе | Требование | |
|---|---|---|---|
| Загрузка · общий skeleton при первом заходе; спиннер на ⟳ при форсе; тихий кэш — без индикатора. Три подсостояния не различаем визуально (B-8, упрощение v1). | Загрузка | NFR-1 | ✓ |
| Пусто на уровне разделов | Пусто · разделы | R10 | ✓ |
| Пусто на уровне мероприятий (текст без «12 месяцев», B-2) | Пусто · мероприятия | R2 neg | ✓ |
| Виджет с нулями (R10 edge, B-3): раздел без оплат в периоде агрегации — виджет не скрывается | Виджет с нулями | R10 edge | ✓ |
| Карточка без оплаченных заказов | Карточка без заказов | R10 · R3 | ✓ |
| Ошибка доступа (нет группы) — отдельный экран | Отказ в доступе | R8 | ✓ |
| Ошибка источника — последние данные + «устаревшие» | Ошибка источника | NFR-1 · R9 | ✓ |
| Пустой поиск/фильтр — «ничего не найдено» | Пустой поиск | R20 neg | ✓ |
| Прочерк дельты — нет сопоставимого периода (нет базы) | Дельта · прочерк | R17 | ✓ |
| Деление на 0 в процентной дельте (DQ-3) | Дельта · деление /0 | R17 · DQ-3 | ✓ |
| Дельта · оба = 0 (R17 edge, B-4): оба периода считаются, оба нулевые — отличается от «нет базы» | Дельта · оба = 0 | R17 edge | ✓ |
| Сетевая ошибка при обновлении — тост «не удалось обновить» | Кнопка «Обновить» в режиме «Ошибка источника» → тост | R7 | ✓ |
| Нет сети (оффлайн) — цифры не показываем, не выдаём устаревшее за актуальное | Нет сети | NFR-6 | ✓ |
Акцент на negative / edge. У каждого — экранное состояние, на котором кейс виден.
| Req | Тип | Тест-кейс | Экранное состояние |
|---|---|---|---|
| R1 | happy | Разделы всех 4 типов → 4 виджета разного типа в фикс. порядке | Дашборд |
| R1 | edge | Раздел A без заказов за 12 мес → виджет с нулями, не исчезает | Пусто · разделы / R10 |
| R2 | happy | Раздел C, 23 мероприятия → первые 20 + «Показать ещё» | Список + поиск |
| R2 | neg | Раздел без мероприятий за окно → «нет мероприятий за период» | Пусто · мероприятия |
| R3 | happy | Товары ИП + РТВ + Озаригн-Глобал → ₽ и € раздельно, два «Всего» | Карточка (по сайту + итоги) |
| R3 | happy | 3 ценовых сектора → 3 строки секторов со своим счётом и суммой | Карточка (по сектору) |
| R3 | neg | Мероприятие без заказов → все строки нули, карточка живёт | Карточка без заказов |
| R3 | edge | Товар снят с продажи, исторические оплаты есть → строка с бейджем «снят» и историч. цифрами | Карточка · Сектор C «снят» |
| R3 | edge | Очень длинное название → полное в карточке (переносится) | Карточка (шапка) · DQ-5 |
| R7 | happy | «Обновить» → цифры на момент нажатия, метка «Обновлено» обновилась | Кнопка ⟳ справа вверху |
| R8 | neg | Пользователь не в группе → экран отказа, цифры не отдаются | Отказ в доступе |
| R8 | edge | Группу сняли в активной сессии → сессия живёт, новый вход — отказ | Отказ в доступе (текст про след. вход) |
| R10 | happy | Мероприятие без оплат → разрезы = 0, итог = 0, без ошибки | Карточка без заказов |
| R13 | happy | A на 3 сайтах в ₽ и € → две суммы раздельно | Дашборд · WidgetA |
| R14 | happy | Серия 5 лет → 5 строк, текущий год выделен | Дашборд · WidgetB «сейчас» |
| R14 | edge | Год без мероприятий в окне → строка с нулями, не скрыта | Дашборд · WidgetB (нулевая строка) |
| R15 | happy | Виджет C → кол-во, последнее, итог; нажатие открывает список | Дашборд · WidgetC → Список |
| R10 | edge | Раздел A без оплат за 12 мес → виджет с нулями, не скрывается | Виджет с нулями |
| R16 | happy | Подписки с оплатами в ₽ и € → ₽ над € стопкой в виджете, тарифе, итоге | Подписки · WidgetD + «На год» · итог |
| R16 | neg | D без подписок и продаж → нули, дельты по правилам R17 | Дельта · прочерк |
| R16 | edge | Раздел запущен в текущем месяце → «месяц к месяцу» прочерком | Дельта · прочерк |
| R17 | happy | Рост 30% в прошлом месяце → «+30%» + база «к пред. месяцу» | Подписки · WidgetD |
| R17 | neg | Нет прошлого года (новый раздел) → «год к году» = н/д, прочерк | Дельта · прочерк |
| R17 | edge | В прошлом месяце 0, в этом 10 → абсолют «+N», без % (нет деления на 0) | Дельта · деление /0 «рост с нуля» |
| R17 | edge | Оба периода = 0 → прочерк «без активности · н/д»; отличается от «нет базы» | Дельта · оба = 0 |
| R18 | happy | 3 актуальных тарифа + 1 снят → 4 строки + «Всего» | Подписки · таблица тарифов |
| R18 | happy | Тариф с оплатами в евро → ₽ над € стопкой в строке тарифа и в «Всего» | Подписки · «На год» · итог |
| R18 | edge | Тариф снят с продажи, активные подписки есть → строка с активными и нулём по продажам | Подписки · тариф «снят» |
| R19 | happy | Каждый раздел отрисован виджетом своего типа | Дашборд · бейдж типа A/B/C/D |
| R20 | happy | Поиск «Январский» + диапазон дат → пересечение условий | Список + поиск · чипы фильтра |
| R20 | neg | Пустой результат → «ничего не найдено», пагинация скрыта | Пустой поиск |
| R20 | edge | Поиск дополнен во время 2-й порции → сброс к первой порции | Список + поиск (сброс shown) |
| R21 | happy | 23 при порции 20 → 20 + 3, после второго нажатия кнопка скрыта | Список + поиск · «показано N из M» |
| R21 | edge | Кол-во ровно = порции → кнопка не показывается | Список + поиск (фильтр до 20) |
| NFR-1 | edge | Источник недоступен → последние данные + пометка «устаревшие»; ⟳ доступна | Ошибка источника |
| NFR-6 | edge | Нет сети → состояние «Нет сети», цифры не выдаются за актуальные; «Повторить» | Нет сети |
| NFR-9 | happy | Все даты и метка «Обновлено» — в UTC+3 (МСК) | Подвал на каждом экране · «(МСК)» |
Каждое R легло на экран либо явно отнесено к бэкенду.
| Req | Что требует | Точка на экране | |
|---|---|---|---|
| R1 | Главный дашборд, виджеты в фикс. порядке | Вкладка «Дашборд» | |
| R2 | Список мероприятий, сортировка свежие сверху, окно периода снято (B-2). Вкладка «Мероприятия» — общий список всех разделов с подписью раздела на каждой строке; клик на виджет дашборда — список конкретного раздела. | Вкладка «Мероприятия» / клик на WidgetA/B/C | |
| R3 | Карточка: разрезы, две валюты стопкой (B-1), «Всего» по каждой валюте отдельно. Расширение: блок «По дням» для многодневных мероприятий (кол-во участников по билету на день). | Карточка мероприятия · «Итог», «По дням», «По сектору», «По сайту» | |
| R4 | Авто-появление из каталога (суточный цикл) | Бэкенд; след — новые строки в списке | |
| R5 | Группировка товаров в мероприятие | Бэкенд; след — разрезы в карточке (R3) | |
| R6 | Ручной маппинг товар↔мероприятие | Админка Битрикса (вне PWA, T4-b) | |
| R7 | Принудительное обновление | Кнопка ⟳ справа вверху + тост ошибки | |
| R8 | Доступ по группе, экран отказа | Экран «Отказ в доступе» | |
| R9 | Видимая свежесть данных | Подвал «Обновлено» на каждом экране | |
| R10 | Корректное отображение нулей, в т.ч. виджет с нулями (B-3) | «Карточка без заказов», «Виджет с нулями», пустые состояния | |
| R11 | Защита ручных правок от авто | Бэкенд; нет UI | |
| R13 | Виджет A «накопительный»; кликабелен → список своих мероприятий | Дашборд · WidgetA → Список (Радаст Кипр) | |
| R14 | Виджет B «год к году», текущий выделен; кликабелен → список своих мероприятий | Дашборд · WidgetB → Список (РадасТВ) | |
| R15 | Виджет C «каталог», нажатие → список | Дашборд · WidgetC → Список (Озарины) | |
| R16 | Виджет D «подписочный», 3 метрики + 2 дельты, ₽/€ стопкой если есть евро (B-5) | Дашборд · WidgetD / Подписки | |
| R17 | Две дельты для D, знак + база; состояния «прочерк», «деление /0», «оба = 0» (B-4) | WidgetD · 3 сценария дельт | |
| R18 | Разбивка по тарифам + «Всего» по каждой валюте отдельно (B-5) | Вкладка «Подписки» · таблица + итог | |
| R19 | Тип раздела — атрибут | Бейдж типа A/B/C/D на каждом виджете | |
| R20 | Поиск + фильтр по диапазону дат | Панель над списком + чипы | |
| R21 | Пагинация «Показать ещё» | Плашка со счётчиком N из M | |
| R22 | Изменения свойств → уведомления админу. Финал: в PWA только бейдж-индикатор + ссылка в админку Битрикса; отдельного интерфейса нет | Меню · «Требуют сверки» (бейдж + ссылка) |
Каждый видимый элемент восходит к требованию или к утверждённому паттерну/решению.
| Элемент интерфейса | Основание |
|---|---|
| Нижняя навигация (4 вкладки) | DQ-1 · дизайн-заметки |
| Кнопка ⟳ справа вверху | R7 + паттерн текущего PWA |
| Подвал «Обновлено … (МСК)» | R9 · NFR-9 |
| Цветовая кодировка строк (violet ₽ / emerald €) | Паттерн PWA + семантика валют R3 |
| Бейдж типа A/B/C/D | R19 |
| Бейдж «сейчас» на текущем годе | R14 (текущий год выделен) |
| Плашки-выводы (лавандовые) | Паттерн дизайн-системы Integramma (editorial), не данные |
| Статус-бар, home-indicator | Хром устройства NFR-4, не функция |
| Пункт «Требуют сверки» в меню | R22 финал: в PWA только бейдж-индикатор; вся работа в админке Битрикса (B-9) |